/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.ObraSocialFisica;
import hibernate.objeto.ObraSocial;
import hibernate.objeto.Paciente;
import java.util.Vector;

/**
 *
 * @author Gonzalo
 */
public class ObraSocialLogica extends CapaLogica {

    /**
     * Crea y persiste la obra social.
     *
     * @param nombreObraSocial El nombre de la obra social
     * @param obraSocial El objeto a guardar, pueder ser vacio en caso de que
     * se trate de un alta o, una completa en caso de modificación
     * @param idObraSocial Un arreglo que contendrá el id del objeto creado para
     * su posterior recuperación
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarObraSocial(String nombreObraSocial,
            ObraSocial obraSocial, int[] idObraSocial) {
        //Crea el objeto
        obraSocial = crearUObtenerObjetoObraSocial(nombreObraSocial, obraSocial);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(obraSocial)) {
            idObraSocial[0] = obraSocial.getIdObraSocial();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Elimina logicamente la obra social.
     *
     * @param obraSocial El objeto ObraSocial a eliminar
     * @return true si se eliminó correctamente, false en caso contrario
     */
    public static boolean eliminarObraSocial(ObraSocial obraSocial) {        
        //Setea activo
        obraSocial.setEnBdObraSocial(false);

        //Guarda en la base de datos
        return CapaFisica.guardarOActualizarObjeto(obraSocial);
    }

    /**
     * Crea un objeto obra social con los datos pasados por parámetro.
     *
     * @param nombreObraSocial El nombre de la obra social
     * @param obraSocial El objeto a guardar, pueder ser vacio en caso de que
     * se trate de un alta o, una completa en caso de modificación
     * @return El objeto ObraSocial creado
     */
    private static ObraSocial crearUObtenerObjetoObraSocial(
            String nombreObraSocial, ObraSocial obraSocial) {
        
        if (obraSocial == null) {
            //Alta, primero verifica si existió antes
            obraSocial = getObraSocialPorNombreYPorEnBd(nombreObraSocial, false);

            //Si nunca existió, la creo
            if (obraSocial == null) {
                obraSocial = new ObraSocial();
            }
        }
        
        //Setea el nombre
        obraSocial.setDetalleObraSocial(nombreObraSocial.toUpperCase());
        //Setea el estado
        obraSocial.setEnBdObraSocial(true);
        
        return obraSocial;
    }

    /**
     * Elimina la asociación con los pacientes que poseen el servicio
     * para poder eliminar la obra social.
     *
     * @param obraSocial La obra social a la cual se le quitaran las asociones
     */
    public static void quitarAsociacionConPacientes(ObraSocial obraSocial) {
        Vector<Paciente> vectorPacientes =
                PacienteLogica.getVectorPacientePorIdObraSocial(
                obraSocial.getIdObraSocial());
        for (int i = 0; i < vectorPacientes.size(); i++) {
            vectorPacientes.elementAt(i).setObraSocial(null);
            PacienteLogica.guardarOActualizarObjeto(
                    vectorPacientes.elementAt(i));
        }
    }

    /**
     * Retorna el objeto ObraSocial según el id.
     *
     * @param id El id de la obra social
     * @return El objeto ObraSocial consultado, null si no existe
     */
    public static ObraSocial getObraSocialPorId(int id){
        return ObraSocialFisica.getObraSocialPorId(id);
    }

    /**
     * Retorna el vector de objetos ObraSocial activas según el nombre.
     *
     * @return El objeto ObraSocial consultado , null si no existe
     */
    public static Vector<ObraSocial> getVectorObraSocialEnBd() {
        return ObraSocialFisica.getVectorObraSocialPorEnBd(true);
    }

    /**
     * Retorna el objeto ObraSocial según el nombre y el estado.
     *
     * @param nombreObraSocial El nombre de la Obra Social
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto ObraSocial consultado , null si no existe
     */
    public static ObraSocial getObraSocialPorNombreYPorEnBd(
            String nombreObraSocial, boolean estado) {
        return ObraSocialFisica.getObraSocialPorNombreYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(
                nombreObraSocial), estado);
    }

    /**
     * Verifica si la obra social ya se encuentra cargado en la base de datos.
     *
     * @param nombreObraSocial El detalle de la obra social consultada
     * @param estado false si es baja lógica, true si aún activo
     * @return true si existe, false en caso contrario
     */
    public static boolean existeObraSocialPorNombreYPorEnBd(
            String nombreObraSocial, boolean estado) {
        return getObraSocialPorNombreYPorEnBd(nombreObraSocial, estado) != null;
    }

    /**
     * Retorna el vector de objetos Paciente de los cuales la obra social esta
     * asignada.
     *
     * @param idObraSocial El id de la obra social
     * @return El vector de objetos Paciente
     */
    public static Vector<Paciente> getVectorPacientePorIdObraSocial(
            int idObraSocial) {
        return ObraSocialFisica.getVectorPacientePorIdObraSocial(
                idObraSocial);
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la obra social.
     *
     * @param obraSocial La obra social
     * @return El String que contiene el HTML
     */
    public static String getObraSocialHTML(ObraSocial obraSocial) {
        String obraSocialHTML = "";
        
        if (obraSocial != null) {
            obraSocialHTML =
                    "<font size=\"3\" face=\"arial\" color=\"black\">Obra Social: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    obraSocial.getDetalleObraSocial() + "</font><br>";

        }
        return obraSocialHTML;
    }

}
